[Amazon SNS] SMSのメッセージの送信者IDを指定してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、Amazon SNSで送信する SMS のメッセージの送信者 ID を指定してみました。
SMS の送信者IDは既定で"NOTICE"となる
AWS で SMS を送信できる機能である Amazon SNS ですが、送信した SMS の送信者 ID は既定でNOTICE
となります。
しかし、ビジネスでの利用においてはブランディングのためにこの送信者 ID は企業やサービスを表す ID としたい場合が多いと思います。また、SMS アプリ上でのメッセージの表示は送信者 ID ごとになるため、他企業と同じ画面にメッセージが表示されるのは避けたいですね。
送信者IDを指定してみる
そこで今回は、送信者 ID をclassmethod
として、以下の方法で SMS の送信を試してみます。
- マネジメントコンソール
- AWS CLI
- Node.js(Lambda 関数)
マネジメントコンソールの場合
AWS マネジメントコンソールの場合は、[Mobile]-[テキストメッセージング(SMS)]-[テキストメッセージングの発行]で、[発信元 ID]-[送信者 ID]で指定することができます。
ちなみに記載の通り送信者 ID に指定できる値には下記の制限があります。
少なくとも 1 つの文字を含み、スペースを含まない、最大 11 文字の英数字またはハイフン (-)。先頭と末尾は英数字である必要があります。
メッセージを発行すると、送信者 ID がclassmethod
となったメッセージを受信できました。
AWS CLIの場合
AWS CLI のsns publish
コマンドを使用します。
sns publish
での送信者 ID の指定は、message-attributes
パラメータを使用します。
$ message="message from aws cli."
$ phoneNumber="+8180XXXXXXXX"
$ senderId="classmethod"
$ aws sns publish \
--message ${message} \
--phone-number ${phoneNumber} \
--message-attributes \
'{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'
送信者 ID がclassmethod
となったメッセージを受信できました。
制限に違反した値(英数字以外)を送信者 ID に指定した場合はParameterValueInvalid
エラーとなりました。
$ senderId="クラスメソッド"
$ aws sns publish \
--message ${message} \
--phone-number ${phoneNumber} \
--message-attributes \
'{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'
An error occurred (ParameterValueInvalid) when calling the Publish operation: The senderID provided 'クラスメソッド' is not valid, it must be 1-11 alpha-numeric or hyphen (-) characters. It has to start and end with an alphanumeric character.
Node.js(Lambda関数)の場合
CDKコード
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as lambdaNodejs from '@aws-cdk/aws-lambda-nodejs';
import * as iam from '@aws-cdk/aws-iam';
export class AwsCdkAppStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const sendSmsFunction = new lambdaNodejs.NodejsFunction(
this,
'sendSmsFunction',
{
functionName: 'send-sms-function',
entry: './src/lambda/handlers/send-sms-handler.ts',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_14_X,
}
);
const snsTopicPolicy = new iam.PolicyStatement({
actions: ['sns:Publish'],
resources: ['*'],
});
sendSmsFunction.addToRolePolicy(snsTopicPolicy);
}
}
Lambdaコード
AWS CLI の場合と同様ですが、送信者 ID の指定は、message-attributes
パラメータを使用します。
import * as AWS from 'aws-sdk';
const MESSAGE = 'message from AWS SDK for JavaScript on lambda';
const SENDER_ID = 'classmethod';
const sns = new AWS.SNS({ apiVersion: '2010-03-31' });
interface Event {
phoneNumber: string;
}
export const handler = async (event: Event) => {
const publischParams: AWS.SNS.PublishInput = {
Message: MESSAGE,
PhoneNumber: event.phoneNumber,
MessageAttributes: {
'AWS.SNS.SMS.SenderID': {
DataType: 'String',
StringValue: SENDER_ID,
},
},
};
await sns.publish(publischParams).promise();
};
動作
作成した Lambda 関数をイベントを指定して実行します。
{
"phoneNumber": "+81XXXXXXXXXX"
}
送信者 ID がclassmethod
となったメッセージを受信できました。
まとめ
- Amazon SNS で送信する SMS では送信者 ID を指定可能
- 送信者 ID を指定することにより、メッセージの送信者の区別やブランディングを行うことができる
- CLI や SDK での送信者 ID の指定は
MessageAttributes
を使って行う
参考
以上